package com.loong.web.gp4j.service.error;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.ExecutorService;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import com.loong.web.gp4j.bean.schema.error.ErrorSchema;
import com.loong.web.gp4j.bean.vo.error.ErrorVo;
import com.loong.web.gp4j.dao.error.ErrorDao;
import com.loong.web.suppert.collection.param.PageParam;
import com.loong.web.suppert.collection.param.ParamMap;
import com.loong.web.suppert.collection.vo.ResultVo;
import com.loong.web.suppert.collection.vo.ResultVoFactory;
import com.loong.web.suppert.collection.vo.RowsVo;

/**
 * 异常服务
 *
 * @author 张成轩
 */
@Service
public class ErrorService {

	/** 日志输出对象 */
	private Logger log = Logger.getLogger(getClass());

	@Resource
	private ErrorDao errorDao;
	@Resource(name = "errorlogThreadPool")
	private ExecutorService threadPool;

	/**
	 * 保存异常信息
	 * 
	 * @param request 请求
	 * @param type 异常类型
	 */
	public void error(HttpServletRequest request, String type) {

		ErrorSchema error = new ErrorSchema();
		ErrorAdapter.convert(request, type, error);
		error(error);
		Exception ex = (Exception) request.getAttribute("javax.servlet.error.exception");
		if (ex != null)
			log.error(ex.getMessage(), ex);
	}

	/**
	 * 保存异常信息
	 * 
	 * @param ex 异常
	 */
	public void error(Exception ex) {

		ErrorSchema error = new ErrorSchema();
		ErrorAdapter.convert(ex, error);
		error(error);
		log.error(ex.getMessage(), ex);
	}

	/**
	 * 保存异常
	 * 
	 * @param error 异常对象
	 */
	public void error(ErrorSchema error) {

		threadPool.execute(new Runnable() {

			@Override
			public void run() {

				errorDao.insert(error);
			}
		});
	}

	/**
	 * 获取异常代码集
	 * 
	 * @return 异常代码集
	 */
	public List<String> getTypes() {

		// 查询用户
		List<String> types = errorDao.getTypes();
		// 排序
		Collections.sort(types);
		return types;
	}

	/**
	 * 获取异常
	 * 
	 * @param type 异常类型
	 * @param page 分页
	 * @return 返回对象
	 */
	public RowsVo<ErrorVo> queryErrors(String type, PageParam page) {

		ParamMap params = new ParamMap();
		params.setPage(page);
		params.put("type", type);
		// 查询数据
		List<ErrorSchema> errors = errorDao.query(params);
		// 封装对象
		List<ErrorVo> errorVos = new LinkedList<ErrorVo>();
		ErrorAdapter.convert(errors, errorVos);
		RowsVo<ErrorVo> vo = new RowsVo<ErrorVo>();
		vo.setPage(page);
		vo.setRows(errorVos);
		return vo;
	}

	/**
	 * 移除异常类型
	 * 
	 * @param type 异常类型
	 * @return 返回对象
	 */
	public ResultVo<?> remove(String type) {

		int count = errorDao.deleteByType(type);
		if (count > 0)
			return ResultVoFactory.succ();
		else
			return ResultVoFactory.fail("删除失败");
	}
}
